import { defineStore } from 'pinia'
import TestData from './TestData.js';

// 格式化数据方法
const Formatter = (_arr, callback) => {
    // 使用Array.prototype.map()方法生成新数组，可以省略创建数组的一步。
    // 如果严格要求效率的情况下，仍然建议使用For循环
    return _arr.map(item => {
        return {
            name: item.label,
            // 因为是计算属性，在不计较 ∞ 时，直接判断是否为真
            value: callback(item) || 0,
        }
    });
}

// 此处 store ID 是为了区分示例项目模块。请勿效仿
export const UseRateStore = defineStore('901_inspect', {
    state: () => {
        return {
            // 将两份数据分开进行存放,更贴合业务实际情况
            EquData: [],
            StationData: [],
        }
    },
    getters: {
        // 通过Getter 实时刷新数据
        EquUseRatio() {
            return Formatter(this.EquData, (stat) => {
                // 取两位小数并四舍五入(注，不用 Number.toFix(2) 方法的原因是这种方法会出现 20.00 的情况 )
                return Math.round(stat.working / stat.total * 10000) / 100;
            });
        },
        StationOnlineRatio() {
            return Formatter(this.StationData, (stat) => {
                return Math.round(stat.online / stat.total * 10000) / 100;
            });
        },
    },
    actions: {
        // 初始化数据方法，使数据可以实时刷新
        async initData() {
            // 假设数组返回值时乱序的，如何根据已有数据顺序排序返回值
            // Array 写在这个地方是为了方便大家寻找逻辑，实际情况请将 Array 对象放在全局中，防止重复创建 
            const LabelArray = ["一类", "二类", "三类", "四类", "监测", "船载", "便携", "传感器"];

            // 根据指定的 Key 值，在已经排序好的数组里面取 当前值的下标，
            // 下方为 indexOf 方法示例

            this.EquData = (await TestData()).sort((a, b) => {
                return LabelArray.indexOf(a.label) - LabelArray.indexOf(b.label)
            });


            // 如果 indexOf 的效率满足不了需求，还可以用 Mapping 结构提升效率查询值过程的效率
            // 注：Mapping 写在这个地方是为了方便大家寻找逻辑，实际情况请将 Mapping 对象放在全局中，防止重复创建 
            const LabelMapping = {
                "一类": 0,
                "二类": 1,
                "三类": 2,
                "四类": 3,
                "监测": 4,
                "船载": 5,
                "便携": 6,
                "传感器": 7
            }
            this.StationData = (await TestData()).sort((a, b) => {
                return LabelMapping[a.label] - LabelMapping[b.label]
            });;
        },
    }
});